﻿using AsscerMVCN2512.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace AsscerMVCN2512.Controllers
{
    public class RoleController : Controller
    {
        AssetDBEntities1 db = new AssetDBEntities1();

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetData(int page, int limit, string strRoleName, int? RoleID)
        {
            try
            {
                int offset = limit * (page - 1);

                var query = db.RoleInfo.AsQueryable();

                if (!string.IsNullOrEmpty(strRoleName))
                {
                    query = query.Where(r => r.RoleName.Contains(strRoleName));
                }
                if (RoleID.HasValue && RoleID.Value > 0)
                {
                    query = query.Where(r => r.RoleID == RoleID.Value);
                }

                int totalCount = query.Count();

                var data = query
                    .OrderBy(r => r.RoleID)
                    .Skip(offset)
                    .Take(limit)
                    .Select(r => new RoleAddViewModel
                    {
                        RoleID = r.RoleID,
                        RoleName = r.RoleName,
                        RoleReMark = r.RoleReMark
                    })
                    .ToList();

                return Json(new
                {
                    code = 0,
                    msg = "",
                    count = totalCount,
                    data = data
                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new
                {
                    code = 1,
                    msg = "数据查询失败：" + ex.Message,
                    count = 0,
                    data = new List<RoleAddViewModel>()
                }, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult GetAllRoles()
        {
            try
            {
                var roles = db.RoleInfo
                    .Select(r => new
                    {
                        RoleID = r.RoleID,
                        RoleName = r.RoleName
                    })
                    .OrderBy(r => r.RoleID)
                    .ToList();

                return Json(roles, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { error = "获取角色失败：" + ex.Message }, JsonRequestBehavior.AllowGet);
            }
        }

        [HttpPost]
        public ActionResult AddRole(RoleAddViewModel model)
        {
            try
            {
                // 验证参数，角色名称不能为空
                if (string.IsNullOrEmpty(model.RoleName))
                {
                    return Json(new { success = false, msg = "角色名称不能为空" });
                }

                // 创建角色实体并赋值
                RoleInfo newRole = new RoleInfo
                {
                    RoleName = model.RoleName,
                    RoleReMark = model.RoleReMark
                };

                // 将实体添加到数据库上下文并保存更改
                db.RoleInfo.Add(newRole);
                db.SaveChanges();

                // 返回成功结果
                return Json(new { success = true, msg = "新增成功" });
            }
            catch (Exception ex)
            {
                // 捕获异常，返回失败信息
                return Json(new { success = false, msg = "新增失败：" + ex.Message });
            }
        }




        // 编辑角色 - 确保有[HttpPost]特性（关键！前端是POST请求）
        [HttpPost]
        public ActionResult EditRole(RoleAddViewModel model)
        {
            try
            {
                // 1. 验证参数：RoleID必须大于0，角色名称不能为空（避免无效请求）
                if (model.RoleID <= 0 || string.IsNullOrEmpty(model.RoleName))
                {
                    return Json(new { success = false, msg = "参数错误：角色ID无效或角色名称为空" });
                }

                // 2. 从数据库查询要编辑的角色（判断角色是否存在）
                RoleInfo role = db.RoleInfo.Find(model.RoleID);
                if (role == null)
                {
                    return Json(new { success = false, msg = "编辑失败：该角色不存在（可能已被删除）" });
                }

                // 3. 更新角色数据（只更新需要修改的字段）
                role.RoleName = model.RoleName;       // 角色名称
                role.RoleReMark = model.RoleReMark;   // 角色备注（允许为空）

                // 4. 保存到数据库（EF自动跟踪实体修改，无需额外调用Update）
                db.SaveChanges();

                // 5. 返回成功结果（前端会根据success字段判断是否执行后续操作）
                return Json(new { success = true, msg = "编辑成功" });
            }
            catch (Exception ex)
            {
                // 捕获异常（如数据库连接错误、字段验证失败等），返回错误信息
                return Json(new { success = false, msg = "编辑失败：" + ex.Message });
            }
        }

        // 删除角色 - 确保有[HttpPost]特性（关键！前端是POST请求）
        [HttpPost]
        public ActionResult DeleteRole(int RoleID)
        {
            try
            {
                // 1. 验证参数：RoleID必须大于0（避免无效请求）
                if (RoleID <= 0)
                {
                    return Json(new { success = false, msg = "参数错误：角色ID无效" });
                }

                // 2. 从数据库查询要删除的角色（判断角色是否存在）
                RoleInfo role = db.RoleInfo.Find(RoleID);
                if (role == null)
                {
                    return Json(new { success = false, msg = "删除失败：该角色不存在（可能已被删除）" });
                }

                // 3. 从数据库上下文移除角色（标记为待删除）
                db.RoleInfo.Remove(role);

                // 4. 保存到数据库（执行物理删除）
                db.SaveChanges();

                // 5. 返回成功结果
                return Json(new { success = true, msg = "删除成功" });
            }
            catch (Exception ex)
            {
                // 捕获异常（如角色被其他表引用导致删除失败）
                return Json(new { success = false, msg = "删除失败：" + ex.Message });
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}